package Servlets;

import Estructuras.Principales.TPVPrincipalDTO;
import Herramientas.Herramientas;
import Herramientas.RedireccionPOPUP;
import PuntoVentaDAOS.ArticulosVentaDAO;
import PuntoVentaDAOS.CatalogoProductosDAO;
import PuntoVentaDTOS.PerfilArticuloDTO;
import SistemaDAOS.HistorialVentaDAO;
import SistemaDTOS.UsersDTO;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Vector;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import sun.security.provider.PolicyParser;

/**
 *
 * @author AlanGR
 */
@WebServlet(name = "PuntoVenta", urlPatterns = {"/PuntoVenta"})
public class PuntoVenta extends HttpServlet {

    /**
     * Processes requests for both HTTP <code>GET</code> and <code>POST</code>
     * methods.
     *
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    protected void processRequest(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        response.setContentType("text/html;charset=UTF-8");
        PrintWriter out = response.getWriter();
        try {

            String action = request.getParameter("action");
            HttpSession session = request.getSession();

// TERMINAL TPV INICIO ENTRE ARTICULO
            if (action.equals("inicio")) {
                this.inicio(request, response, session);

// CONTROL PARA SERVICIO QUE RECUPERA EL CODIGO DE BARRAS
            } else if (action.equals("entraArticuloVenta")) {
                this.entraArticuloVenta(request, response, session);

// CONTROL PARA SERVICIO QUE RECUPERA EL CODIGO DE BARRAS            
            } else if (action.equals("cancelaArticulo")) {
                this.cancelaArticulo(request, response, session);

// CONTROL PARA SERVICIO QUE REINICA LA VENTA       
            } else if (action.equals("reiniciaVenta")) {
                this.reiniciaVenta(request, response, session);

// CONTROL PARA SERVICIO SERVICIO QUE FINALIZA UNA VENTA    // POP UP TOTAL COBRO  
            } else if (action.equals("finVenta")) {
                this.finVenta(request, response, session);

// DESCUENTA LA LISTA DE COMPRA DE LA EXISTENCIA            
            } else if (action.equals("finalizarVenta")) {
                this.finalizarVenta(request, response, session);

// CONTROL PARA SERVICIO PARA EL REGISTRO Y EDICION DE PRODUCTOS    
            } else if (action.equals("catalogoProductos")) {
                this.catalogoProductos(request, response, session);

// CONTROL PARA SERVICIO PARA EL REGISTRO Y EDICION DE PRODUCTOS    
            } else if (action.equals("nuevoProducto")) {
                this.nuevoProducto(request, response, session);

// CONTROL PARA SERVICIO PARA EL REGISTRO Y EDICION DE PRODUCTOS    
            } else if (action.equals("buscarProductoGranel")) {
                this.buscarProductoGranel(request, response, session);

// CONTROL PARA SERVI  
            } else if (action.equals("buscarProductoGranel")) {
                this.buscarProductoGranel(request, response, session);

// EDICION DE ARTICULOS 
            } else if (action.equals("editarArticulo")) {
                this.editarArticulo(request, response, session);

            } else {
                System.out.println("POSIBLE ERROR EN ACTION CONTROLADOR NO DISPONIBLE EN SERVLET PuntoVenta.java");
            }
        } finally {
            out.close();
        }
    }

    // <editor-fold defaultstate="collapsed" desc="HttpServlet methods. Click on the + sign on the left to edit the code.">
    /**
     * Handles the HTTP <code>GET</code> method.
     *
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        processRequest(request, response);
    }

    /**
     * Handles the HTTP <code>POST</code> method.
     *
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        processRequest(request, response);
    }

    /**
     * Returns a short description of the servlet.
     *
     * @return a String containing servlet description
     */
    @Override
    public String getServletInfo() {
        return "Short description";
    }// </editor-fold>

    /**
     * SERVICIO DE SERVLET PARA RECUPERAR EL USUARIO LOGUEADO
     *
     * @param request
     * @param response
     * @param session
     * @return
     */
    public UsersDTO usuarioArriba(HttpSession session) {
        UsersDTO userUp = (UsersDTO) session.getAttribute("userUpDTO");

        if (session.getAttribute("userUpDTO") == null) {
            System.out.println("error a recuperar el usuario de la sesion atributo nulo");
        }

        return userUp;
    }

    /**
     * ALAN GONZALEZ SERVICIO DE INICIO ENTRE ARTICULO URL DE ACCESO :
     * ./PuntoVenta?action=inicio
     *
     * @param request
     * @param response
     * @param session
     */
    public void inicio(HttpServletRequest request, HttpServletResponse response, HttpSession session) {

// ---- EN DISEÑO Y DESARROLLO
        Herramientas herramientas = new Herramientas();
        String ticket = herramientas.cadenaAlfanumericaAleatoria(6);
        String ticketCifrado = herramientas.encriptaMD5(ticket);
// ---- EN DISEÑO Y DESARROLLO

        TPVPrincipalDTO principal = new TPVPrincipalDTO();
        ArticulosVentaDAO articulosDAO = new ArticulosVentaDAO();
        UsersDTO usuarioArriba = this.usuarioArriba(session);

        Vector articulosVenta = new Vector();
        articulosVenta = articulosDAO.articulosCompra(usuarioArriba.getId());
        principal.setArticulosCompra(articulosVenta);
        principal.setTotalVenta(articulosDAO.totalVenta(usuarioArriba.getId()));

        session.setAttribute("principalTPV", principal);

        RequestDispatcher d = request.getRequestDispatcher("/TPV/InterfazVenta/entreArticulo.jsp");
        try {
            d.forward(request, response);
        } catch (ServletException ex) {
            Logger.getLogger(PuntoVenta.class.getName()).log(Level.SEVERE, null, ex);
        } catch (IOException ex) {
            Logger.getLogger(PuntoVenta.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    /**
     * ALAN GONZALEZ SERVICIO QUE RECIBE EL CODIGO DE BARRAS
     *
     * @param request
     * @param response
     * @param session
     */
    public void entraArticuloVenta(HttpServletRequest request, HttpServletResponse response, HttpSession session) {
        // se baja el usuario de la sesion activa 
        UsersDTO usuarioArriba = this.usuarioArriba(session);

        Vector errores = new Vector();
        String codigoBarrras = request.getParameter("codigoBarrasArticulo");
        ArticulosVentaDAO articulosDAO = new ArticulosVentaDAO();
        /*
         .- esquema de operacion del servio
         1.- verifica si el codigo de barras ingresado esta dentro del catalogo
         2.- si el codigo de barras existe dentro del catalogo verificar si las existencias del articulo son mayores 
         a la que se esta solictando dentro de la venta por lo tanto se deben considerar el que un articulo uede ser pasada
         a lectura de cb varias veces por lo tanto se debera contar cuantas unidades del mismo cb esta dentro de la venta
         si numero de piezas en la venta + 1 (el que se registraria) es menor a la existencia del catalogo se realiza
         3.- si las anteriores controlos son aprobados  se realiza lo siguiente
         a1 se escribe el articulo en la tabla de articulos para venta 
         */
        int numeroPiezasVenta = articulosDAO.numeroPiezasVentaCB(codigoBarrras) + 1;

        boolean existeProducto = new Boolean(null);
        existeProducto = articulosDAO.productoEnCatalogo(codigoBarrras);

        double existenciaProducto = 0.0;
        existenciaProducto = articulosDAO.existenciaProducto(codigoBarrras);

        if (existeProducto == true && existenciaProducto >= numeroPiezasVenta) {
            PerfilArticuloDTO perfilDTO = articulosDAO.perfilArticulo(codigoBarrras);
            articulosDAO.registraArticuloVenta(perfilDTO, 1, usuarioArriba.getId()); //catidad default << pieza >> // id del usuario
        } else {
            errores.add("El Articulo que Intenta Ingresar No esta dentro del catalogo o Sus Existencias son Insuficientes");
        }

        TPVPrincipalDTO principal = new TPVPrincipalDTO();
        principal.setErrores(errores);
        principal.setnErrores(errores.size());

        Vector articulosVenta = new Vector();
        articulosVenta = articulosDAO.articulosCompra(usuarioArriba.getId());
        principal.setArticulosCompra(articulosVenta);

        principal.setTotalVenta(articulosDAO.totalVenta(usuarioArriba.getId()));

        session.setAttribute("principalTPV", principal);

        RequestDispatcher d = request.getRequestDispatcher("/TPV/InterfazVenta/entreArticulo.jsp");
        try {
            d.forward(request, response);
        } catch (ServletException ex) {
            Logger.getLogger(PuntoVenta.class.getName()).log(Level.SEVERE, null, ex);
        } catch (IOException ex) {
            Logger.getLogger(PuntoVenta.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    /**
     * ALAN GONZALEZ CANCELA ARTICULO COMPRA EN CURSO
     *
     * @param request
     * @param response
     * @param session
     */
    public void cancelaArticulo(HttpServletRequest request, HttpServletResponse response, HttpSession session) {
        UsersDTO usuarioArriba = this.usuarioArriba(session);

        int id = Integer.parseInt(request.getParameter("id"));

        ArticulosVentaDAO articulosDAO = new ArticulosVentaDAO();
        articulosDAO.cancelaArticuloVenta(id);

        Vector errores = new Vector();

        TPVPrincipalDTO principal = new TPVPrincipalDTO();
        principal.setErrores(errores);
        principal.setnErrores(errores.size());

        Vector articulosVenta = new Vector();
        articulosVenta = articulosDAO.articulosCompra(usuarioArriba.getId());
        principal.setArticulosCompra(articulosVenta);

        principal.setTotalVenta(articulosDAO.totalVenta(usuarioArriba.getId()));

        session.setAttribute("principalTPV", principal);

        RequestDispatcher d = request.getRequestDispatcher("/TPV/InterfazVenta/entreArticulo.jsp");
        try {
            d.forward(request, response);
        } catch (ServletException ex) {
            Logger.getLogger(PuntoVenta.class.getName()).log(Level.SEVERE, null, ex);
        } catch (IOException ex) {
            Logger.getLogger(PuntoVenta.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    /**
     * ALAN GONZALEZ SERVICIO PARA REINICIAR LA VENTA ELIMINIA TODO ARTICULO EN
     * LA TABLA
     *
     * @param request
     * @param response
     * @param session
     */
    public void reiniciaVenta(HttpServletRequest request, HttpServletResponse response, HttpSession session) {
        UsersDTO usuarioArriba = this.usuarioArriba(session);
        ArticulosVentaDAO articulosVentaDAO = new ArticulosVentaDAO();
        articulosVentaDAO.reiniciaArticulosVenta(usuarioArriba.getId());
        RequestDispatcher d = request.getRequestDispatcher("./PuntoVenta?action=inicio");
        try {
            d.forward(request, response);
        } catch (ServletException ex) {
            Logger.getLogger(PuntoVenta.class.getName()).log(Level.SEVERE, null, ex);
        } catch (IOException ex) {
            Logger.getLogger(PuntoVenta.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    /**
     * MUESTRA EL POP UP DEL TOTAL
     *
     * @param request
     * @param response
     * @param session
     */
    public void finVenta(HttpServletRequest request, HttpServletResponse response, HttpSession session) {
        RequestDispatcher d = request.getRequestDispatcher("TPV/InterfazVenta/totalVenta.jsp");
        try {
            d.forward(request, response);
        } catch (ServletException ex) {
            Logger.getLogger(PuntoVenta.class.getName()).log(Level.SEVERE, null, ex);
        } catch (IOException ex) {
            Logger.getLogger(PuntoVenta.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    /**
     * ALAN GONZALEZ SERVICIO QUE FINALIZA LA VENTA << DESCUENTA DE EXISTENCIAS
     * MUESTRA EL TOTAL EN UNA INTERFAZ AMPLIA Y GENERA UN TICKET PDF INTERNO
     *
     * @param request
     * @param response
     * @param session
     */
    public void finalizarVenta(HttpServletRequest request, HttpServletResponse response, HttpSession session) {

        UsersDTO usuarioArriba = this.usuarioArriba(session);
        ArticulosVentaDAO articulosVentaDAO = new ArticulosVentaDAO();

        // SE OBTIENE LA LISTA DE VENTA
        Vector articulosVenta = new Vector();
        articulosVenta = articulosVentaDAO.articulosCompra(usuarioArriba.getId());

        // SE OBTIENE EL TOTAL DE VENTA
        double totalventa = articulosVentaDAO.totalVenta(usuarioArriba.getId());

        // SE ENVIA LA LISTA DE VENTA PARA RESTARLAS DE LAS EXISTENCIAS
        CatalogoProductosDAO catalogoDAO = new CatalogoProductosDAO();
        catalogoDAO.actualizaExistenciasPorVenta(articulosVenta);

        // SE REINICIA LA LISTA DE VENTA
        articulosVentaDAO.reiniciaArticulosVenta(usuarioArriba.getId());

        // SE CREA EL LOG DE VENTA 
        // se regitra la venta con fecha hora y id de cajero asi como una cadena aleatoria y encriptada y validada 
        // se registra con la cadena aleatoria y encriptada cada uno de los articulos que componen esa venta 
        // SE CREA EL LOG DE VENTA 
// ---- EN DISEÑO Y DESARROLLO
        Herramientas herramientas = new Herramientas();
        String ticket = herramientas.cadenaAlfanumericaAleatoria(5);
        String ticketCifrado = herramientas.encriptaMD5(ticket);
// ---- EN DISEÑO Y DESARROLLO

        HistorialVentaDAO historial = new HistorialVentaDAO();
        historial.registroVentaHistorico(ticketCifrado, totalventa, usuarioArriba.getId(), articulosVenta); // UN IDEINTIFICADOR CIFRADO EL TOTALDE LA VENTA Y LA LISTA DE ARTICULOS

        RedireccionPOPUP redireccion = new RedireccionPOPUP();
        redireccion.setServicio("./PuntoVenta?action=inicio");
        session.setAttribute("sistema", redireccion);
        // SE REINICIA EL MODULO PRINCIPAL
        RequestDispatcher d = request.getRequestDispatcher("loading.jsp");
        try {
            d.forward(request, response);
        } catch (ServletException ex) {
            Logger.getLogger(PuntoVenta.class.getName()).log(Level.SEVERE, null, ex);
        } catch (IOException ex) {
            Logger.getLogger(PuntoVenta.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    /**
     * ALAN GONZALEZ
     *
     * @param request
     * @param response
     * @param session
     */
    public void catalogoProductos(HttpServletRequest request, HttpServletResponse response, HttpSession session) {
        TPVPrincipalDTO principal = new TPVPrincipalDTO();
        Vector productos = new Vector();
        CatalogoProductosDAO catalogoDAO = new CatalogoProductosDAO();
        productos = catalogoDAO.productos();
        principal.setCatalogo(productos);
        session.setAttribute("principalTPV", principal);
        RequestDispatcher d = request.getRequestDispatcher("TPV/InterfazProductos/principalProductos.jsp");
        try {
            d.forward(request, response);
        } catch (ServletException ex) {
            Logger.getLogger(PuntoVenta.class.getName()).log(Level.SEVERE, null, ex);
        } catch (IOException ex) {
            Logger.getLogger(PuntoVenta.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    /**
     * ALAN GONZALEZ
     *
     * @param request
     * @param response
     * @param session
     */
    public void nuevoProducto(HttpServletRequest request, HttpServletResponse response, HttpSession session) {
        TPVPrincipalDTO principal = new TPVPrincipalDTO();
        CatalogoProductosDAO catalogoDAO = new CatalogoProductosDAO();
        ArticulosVentaDAO articulosDAO = new ArticulosVentaDAO();
        int index = Integer.parseInt(request.getParameter("index"));
        Vector errores = new Vector();
        switch (index) {
            case 1:// MUESTRA EL FORMULARIO
                RequestDispatcher muestraFormulario = request.getRequestDispatcher("TPV/InterfazProductos/productoInterfaz.jsp");
                try {
                    muestraFormulario.forward(request, response);
                } catch (ServletException ex) {
                    Logger.getLogger(PuntoVenta.class.getName()).log(Level.SEVERE, null, ex);
                } catch (IOException ex) {
                    Logger.getLogger(PuntoVenta.class.getName()).log(Level.SEVERE, null, ex);
                }
                break;
            case 2: // RECUPERA Y VALIDA LOS DATOS DE FORMULARIO REALIZA EL REGISTRO Y REDIRECCIONA CON CONTROL DE ERRORES 

                PerfilArticuloDTO p = new PerfilArticuloDTO();

                if (request.getParameter("cb").length() > 0) {
                    p.setCb(request.getParameter("cb"));
                } else {
                    errores.add("EL CAMPO: CODIGO DE BARRAS, ES OBLIGATORIO");
                }

                if (request.getParameter("descripcion").length() > 0) {
                    p.setDescripcion(request.getParameter("descripcion"));
                } else {
                    errores.add("EL CAMPO: CODIGO DE BARRAS, ES OBLIGATORIO");
                }

                int unidaMedida = Integer.parseInt(request.getParameter("um"));

                if (unidaMedida > 0) {
                    p.setId_um(unidaMedida);
                    if (unidaMedida == 1) {
                        p.setUm("Piezas");
                    } else if (unidaMedida == 2) {
                        p.setUm("Kilos");
                    }
                } else {
                    errores.add("SELECCIONE UNA: UNIDAD DE MEDIDA");
                }

                if (request.getParameter("proveedor").length() > 0) {
                    p.setRazon_social_proveedor(request.getParameter("proveedor"));
                } else {
                    errores.add("EL CAMPO: PROVEEDOR, ES OBLIGATORIO");
                }

                if (request.getParameter("costo").length() > 0) {
                    double costo = Double.parseDouble(request.getParameter("costo"));
                    p.setCostoUnitario(costo);
                } else {
                    errores.add("EL CAMPO: COSTO, ES OBLIGATORIO");
                }

                if (request.getParameter("precioPublico").length() > 0) {
                    double pp = Double.parseDouble(request.getParameter("precioPublico"));
                    p.setPrecioPublico(pp);
                } else {
                    errores.add("EL CAMPO: PRECIO PUBLICO, ES OBLIGATORIO");
                }

                if (request.getParameter("ubicacion").length() > 0) {
                    String ubicacion = request.getParameter("ubicacion");
                    p.setUbicacionFisica(ubicacion);
                } else {
                    errores.add("EL CAMPO:  UBICACION, ES OBLIGATORIO");
                }

                p.setTipo(Integer.parseInt(request.getParameter("tipo"))); // no requiere validacion

                if (errores.size() == 0) {
                    // VALIDACION ANIDADA VERIFICAR SI EL CODIGO DE BARRAS YA SE ENCUENTRA REGISTRADO
                    boolean enCatalogo = new Boolean(null);
                    enCatalogo = articulosDAO.productoEnCatalogo(p.getCb().toString());
                    if (enCatalogo == true) {
                        errores.add("EL CODIGO DE BARRAS PROPORCIONADO YA SE ENCUENTRA REGISTRADO FAVOR DE VERIFICAR");
                        principal.setErrores(errores);
                        principal.setnErrores(errores.size());
                        session.setAttribute("principalTPV", principal);
                        RequestDispatcher onError = request.getRequestDispatcher("TPV/InterfazProductos/productoInterfaz.jsp");
                        try {
                            onError.forward(request, response);
                        } catch (ServletException ex) {
                            Logger.getLogger(PuntoVenta.class.getName()).log(Level.SEVERE, null, ex);
                        } catch (IOException ex) {
                            Logger.getLogger(PuntoVenta.class.getName()).log(Level.SEVERE, null, ex);
                        }
                    } else {
                        //SE PROCEDE CON EL REGISTRO
                        catalogoDAO.registroProductoNuevo(p);
                        RedireccionPOPUP redireccionPop = new RedireccionPOPUP();
                        redireccionPop.setServicio("./PuntoVenta?action=catalogoProductos");
                        session.setAttribute("sistema", redireccionPop);
                        RequestDispatcher onOK = request.getRequestDispatcher("./loading.jsp");
                        try {
                            onOK.forward(request, response);
                        } catch (ServletException ex) {
                            Logger.getLogger(PuntoVenta.class.getName()).log(Level.SEVERE, null, ex);
                        } catch (IOException ex) {
                            Logger.getLogger(PuntoVenta.class.getName()).log(Level.SEVERE, null, ex);
                        }
                    }
                } else {
                    principal.setErrores(errores);
                    principal.setnErrores(errores.size());
                    session.setAttribute("principalTPV", principal);
                    RequestDispatcher onError = request.getRequestDispatcher("TPV/InterfazProductos/productoInterfaz.jsp");
                    try {
                        onError.forward(request, response);
                    } catch (ServletException ex) {
                        Logger.getLogger(PuntoVenta.class.getName()).log(Level.SEVERE, null, ex);
                    } catch (IOException ex) {
                        Logger.getLogger(PuntoVenta.class.getName()).log(Level.SEVERE, null, ex);
                    }
                }
                break;
        }
    }

    /**
     * SERVICIO QUE MUESTRA LA BUSQUEDA DE UN PRODUCTO GRANEL
     *
     * @param request
     * @param response
     * @param session
     */
    public void buscarProductoGranel(HttpServletRequest request, HttpServletResponse response, HttpSession session) {

        UsersDTO usuarioArriba = this.usuarioArriba(session);
        int index = Integer.parseInt(request.getParameter("index"));
        TPVPrincipalDTO principal = new TPVPrincipalDTO();
        ArticulosVentaDAO articulosVentaDAO = new ArticulosVentaDAO();
        CatalogoProductosDAO catalogoPrductosDAO = new CatalogoProductosDAO();
        switch (index) {
            case 1:
                // ABRE EN VENTANA NORMAL
                Vector graneles = new Vector();
                graneles = catalogoPrductosDAO.productosGranel();
                principal.setCatalogoGraneles(graneles);
                session.setAttribute("principalTPV", principal);
                RequestDispatcher onOpen = request.getRequestDispatcher("TPV/InterfazVenta/busquedaGranel.jsp");
                try {
                    onOpen.forward(request, response);
                } catch (ServletException ex) {
                    Logger.getLogger(PuntoVenta.class.getName()).log(Level.SEVERE, null, ex);
                } catch (IOException ex) {
                    Logger.getLogger(PuntoVenta.class.getName()).log(Level.SEVERE, null, ex);
                }
                break;
            case 2:
                // RECARGA EL MISMO JSP CON EL VECTOR DE CONSULTA
                String palabraClaveBusqueda = request.getParameter("nombreProducto");
                Vector catalogoPrductosFiltrados = new Vector();
                catalogoPrductosFiltrados = catalogoPrductosDAO.productosFiltroNombre(palabraClaveBusqueda);
                principal.setCatalogoGraneles(catalogoPrductosFiltrados);
                session.setAttribute("principalTPV", principal);
                RequestDispatcher onShowList = request.getRequestDispatcher("TPV/InterfazVenta/busquedaGranel.jsp");
                try {
                    onShowList.forward(request, response);
                } catch (ServletException ex) {
                    Logger.getLogger(PuntoVenta.class.getName()).log(Level.SEVERE, null, ex);
                } catch (IOException ex) {
                    Logger.getLogger(PuntoVenta.class.getName()).log(Level.SEVERE, null, ex);
                }
                break;
            case 3:
                // ABRE UN POP UP SOLICITANDO LA CANTIDAD DE VENTA 
                String cbItemSeleccionado = request.getParameter("cbSeleccionado");
                session.setAttribute("cbItemSeleccionadoSesion", cbItemSeleccionado);
                // SE CARGA EN HIDEN Y SE ENVIA JUNTO CON LA CANTIDAD AL SIGUIENTE REDIRECCIONAMIENTO
                RequestDispatcher popUpCantidad = request.getRequestDispatcher("TPV/InterfazVenta/granelCantidad.jsp");
                try {
                    popUpCantidad.forward(request, response);
                } catch (ServletException ex) {
                    Logger.getLogger(PuntoVenta.class.getName()).log(Level.SEVERE, null, ex);
                } catch (IOException ex) {
                    Logger.getLogger(PuntoVenta.class.getName()).log(Level.SEVERE, null, ex);
                }
                break;
            case 4:

                String cbItemeCuantificado = request.getParameter("cbSeleccionado");
                double cantidadRequeridaEnKilos = Double.parseDouble(request.getParameter("cantidad"));

                PerfilArticuloDTO articulooGranel = catalogoPrductosDAO.perfilArticulo(cbItemeCuantificado);

                double existenciaDelProductoEnKilos = articulooGranel.getExistencia_neta();
                double existenciaDelProductoEnGramos = existenciaDelProductoEnKilos * 1000;

                double cantidadRequeridaEnGramos = cantidadRequeridaEnKilos * 1000; // 500 gramos 
                double precioPorGramo = (articulooGranel.getPrecioPublico() / 1000);

                double subTotal = (cantidadRequeridaEnGramos * precioPorGramo);

                articulooGranel.setCantidadVentaGranel(existenciaDelProductoEnKilos); // expresando cantidades en kilos
                articulooGranel.setSubtotalVentaGranel(subTotal);

                if (existenciaDelProductoEnGramos >= cantidadRequeridaEnGramos) {
                    // SE PROCEDE AL REGISTRO DENTRO DE LA LISTA DE ARTICULOS DEL CLIENTE Y SE REDIRECCIONA EL JSP CON LA CARGA DE LOS ARTICULOS
                    articulosVentaDAO.registraArticuloGranelVenta(articulooGranel, usuarioArriba.getId()); // se carga el granel con el id de la caja  
                    RequestDispatcher saliendo = request.getRequestDispatcher("loading.jsp");
                    RedireccionPOPUP redireccion = new RedireccionPOPUP();
                    redireccion.setServicio("./PuntoVenta?action=inicio");
                    session.setAttribute("sistema", redireccion);
                    try {
                        saliendo.forward(request, response);
                    } catch (ServletException ex) {
                        Logger.getLogger(PuntoVenta.class.getName()).log(Level.SEVERE, null, ex);
                    } catch (IOException ex) {
                        Logger.getLogger(PuntoVenta.class.getName()).log(Level.SEVERE, null, ex);
                    }
                } else {
// SE REDIRECCIONA EL POP UP CON EL VECTOR DE ERRORES 
                    Vector errores = new Vector();
                    errores.add("Existencias Insuficientes, Favor de Verificar");
                    principal.setErrores(errores);
                    principal.setnErrores(errores.size());
                    session.setAttribute("principalTPV", principal);
                    RequestDispatcher onError = request.getRequestDispatcher("TPV/InterfazVenta/granelCantidad.jsp");
                    try {
                        onError.forward(request, response);
                    } catch (ServletException ex) {
                        Logger.getLogger(PuntoVenta.class.getName()).log(Level.SEVERE, null, ex);
                    } catch (IOException ex) {
                        Logger.getLogger(PuntoVenta.class.getName()).log(Level.SEVERE, null, ex);
                    }
                }
                break;
        }
    }

    /**
     * EDITA ARTICULO
     *
     * @param request
     * @param response
     * @param session
     */
    public void editarArticulo(HttpServletRequest request, HttpServletResponse response, HttpSession session) {
        int index = Integer.parseInt(request.getParameter("index"));
        switch (index) {
            case 1:
                String cb = request.getParameter("");
                CatalogoProductosDAO catalogo = new CatalogoProductosDAO();
                PerfilArticuloDTO perfilProducto = new PerfilArticuloDTO();
                RequestDispatcher onShow = request.getRequestDispatcher("TPV/InterfazProductos/productoInterfaz.jsp");
                try {
                    onShow.forward(request, response);
                } catch (ServletException ex) {
                    Logger.getLogger(PuntoVenta.class.getName()).log(Level.SEVERE, null, ex);
                } catch (IOException ex) {
                    Logger.getLogger(PuntoVenta.class.getName()).log(Level.SEVERE, null, ex);
                }
                break;
            case 2:
                break;
        }
    }
}
